package com.gitee.fsmxm.ocon.core;

import java.util.concurrent.TimeUnit;

/**
 * 池
 *
 * @param <T> T
 * @author fsmxm
 */
public interface Pool<T> {
    /**
     * pool 名称
     * @return pool name
     */
    String name();
    /**
     * 初始化
     *
     * @throws ConvertException e
     */
    void init() throws ConvertException;

    /**
     * 关闭
     */
    void close();

    /**
     * 增加一个
     */
    void add() throws UnsupportedAppException;

    /**
     * 增加一个
     */
    void add(T t);

    /**
     * 获取T，若池为空则返回null
     *
     * @return T
     */
    T get();

    /**
     * 获取T，若在指定时间内获取不到则返回null
     *
     * @param time     时间
     * @param timeUnit 时间单位
     * @return T
     * @throws InterruptedException interrupt exception
     */
    T get(long time, TimeUnit timeUnit) throws InterruptedException;

    /**
     * 获取T，一直等待直到获取到为止
     * @return T
     * @throws InterruptedException interrupt exception
     */
    T take() throws InterruptedException;

    /**
     * 回收
     *
     * @param process process
     */
    void retrieve(T process);
}
